#include <linux/module.h>
#include <linux/workqueue.h>
#include <linux/delay.h>

MODULE_LICENSE("GPL");

static struct workqueue_struct *queue = NULL; // 工作队列
static struct delayed_work mywork;  // 延时工作
static int i = 0; // 控制延时工作的次数

// 工作函数
void work_handle(struct work_struct *work)
{
    printk(KERN_ALERT "Hello World! Workqueue is running...\n");
}

// 初始化函数
static int __init timewq_init(void)
{
    printk(KERN_ALERT "Start workqueue_test module.\n");

    // 创建单线程工作队列
    queue = create_singlethread_workqueue("workqueue_test");
    if (queue == NULL) {
        printk(KERN_ALERT "Failed to create workqueue_test!\n");
        return -1;
    }

    // 初始化延时工作
    INIT_DELAYED_WORK(&mywork, work_handle);

    // 提交延时工作 3 次，每次延迟 5 秒
    for (; i <= 3; i++) {
        queue_delayed_work(queue, &mywork, 5 * HZ);  // HZ 是内核定时器的时钟滴答数（每秒的滴答数）
        ssleep(15); // 睡眠 15 秒，确保延时工作能按预期被调用
    }

    return 0; // 初始化成功
}

// 卸载函数
static void __exit timewq_exit(void)
{
    flush_workqueue(queue); // 等待所有工作完成
    destroy_workqueue(queue); // 销毁工作队列
    printk(KERN_ALERT "Exit workqueue_test module.\n");
}

module_init(timewq_init);   // 加载时调用 timewq_init
module_exit(timewq_exit);   // 卸载时调用 timewq_exit

